package com.biao.java8.demo;

import com.biao.java8.demo.pojo.Employee;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 方法引用:lambda体中的内容已经有方法实现了,可以引用
 * （可以将方法引用理解为 Lambda 表达式的另外一种表现形式）
 * 3种语法格式:
 * 对象::实例方法名
 * 类::实例方法名
 * 类::静态方法名
 * <p>
 * 注意：
 * ①方法引用所引用的方法的参数列表与返回值类型，需要与函数式接口中抽象方法的参数列表和返回值类型保持一致！
 * ②若Lambda 的参数列表的第一个参数，是实例方法的调用者，第二个参数(或无参)是实例方法的参数时，格式： ClassName::MethodName
 * <p>
 * <p>
 * 构造器引用:   构造器的参数列表，需要与 函数式接口中参数(就是使用的参数 类的构造方法参数) 列表保持一致！
 * 格式:  类名::new;
 * <p>
 * <p>
 * 数组引用:
 * Type::new;
 */
public class TestMethodRef {
    public static void main(String[] args) {
        // 先实现方法
        Consumer<String> consumer = x -> System.out.println(x);

        // 使用 对象::实例方法名
        PrintStream printStream = System.out;
        Consumer<String> consumer2 = printStream::println;
        consumer2.accept("aaa");

        // 使用 类::实例方法名
        Consumer<String> consumer3 = System.out::println;
        consumer3.accept("bbb");

        // 使用 类::静态方法名
        Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
        System.out.println(comparator.compare(1, 2));
        Comparator<Integer> compare = Integer::compare;
        System.out.println(compare.compare(1, 2));

        // 构造器引用
        // 使用lambda
        Supplier<Employee> sup = () -> new Employee();
        Employee employee1 = sup.get();
        employee1.setName("王二狗");
        System.out.println(employee1);
        // 使用构造器引用
        Supplier<Employee> sup2 = Employee::new;
        Employee employee2 = sup2.get();
        employee2.setName("王二狗");
        System.out.println(employee2);

        // 数组引用
        // 使用lambda
        Function<Integer, String[]> function = x -> new String[x];
        String[] strings = function.apply(10);      // 给数组申请10 个长度
        System.out.println(strings.length);
        // 使用数组引用
        Function<Integer, String[]> function2 = String[]::new;
        String[] strings2 = function2.apply(20);
        System.out.println(strings2.length);
    }

}
